﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Client.TopLevel
{
    /// <summary> Базовый интерфейс; общий функционал всех систем </summary>
    public interface ISys
    {
    }

    /// <summary> Система идентификации; фиктивная - служит для создания объекта типа RepositoryManager </summary>
    public interface IIdentificationSys : ISys
    {
        RepositoryManager GetRepositoryManager();
    }

    public interface ILoginSys : ISys
    {
        /// <summary> Регистрация появления сотрудника на работе </summary>
        bool LogIn();

        /// <summary> Регистрация ухода сотрудника с работы </summary>
        bool LogOut();
    }

    /// <summary> Система работы с персоналом </summary>
    public interface IPersonnelSys : ISys
    {
        #region Employee Area

        /// <summary> Получение данных о текущем сотруднике </summary>
        TLEmployee GetEmployee();

        /// <summary> Завершение выполнения задачи </summary>
        bool FinishTask(TLTask task);

        TLPosition GetPosition();

        #endregion

        #region Manager Area

        /// <summary> Добавление нового сотрудника в систему (только для менеджеров) </summary>
        bool AddEmployee(TLEmployee employee);

        /// <summary> Редактирование сотрудника (только для менеджеров) </summary>
        bool EditEmployee(TLEmployee oldEmployee, TLEmployee newEmployee);

        /// <summary> Удаление сотрудника (только для менеджеров) </summary>
        bool DeleteEmployee(TLEmployee employee);

        /// <summary> Получение коллекции всех сотрудников (только для менеджеров) </summary>
        IEnumerable<TLEmployee> GetAll();  

        /// <summary> Добавление новой задачи в систему (только для менеджеров) </summary>
        bool AddTask(TLTask task);

        /// <summary> Удаление задачи из системы (только для менеджеров) </summary>
        bool DeleteTask(TLTask task);

        /// <summary> Редактирование задачи (только для менеджеров) </summary>
        bool EditTask(TLTask oldTask, TLTask newTask);

        /// <summary> Закрытие задачи (только для менеджеров) </summary>
        bool CloseTask(TLTask task);

        /// <summary> Все задачи (только для менеджеров) </summary>
        IEnumerable<TLTask> GetAllTasks();

        IEnumerable<TLPosition> GetAllPositions();

        #endregion
    }

    /// <summary> Система построения отчетов; отчет - это информация о сотруднике плюс отработанное время </summary>
    public interface IReportSys : ISys
    {
        #region Employee Area

        /// <summary> Получение отчета по текущему сотруднику </summary>
        TLReport Get(DateTime startTime, DateTime endTime);

        #endregion

        #region Manager Area

        /// <summary> Получение отчетов по всем сотрудникам (только для менеджеров) </summary>
        IEnumerable<TLReport> GetAll(DateTime startTime, DateTime endTime);

        #endregion
    }

    /// <summary> Система построения отчетов; отчет - это информация о сотруднике плюс отработанное время </summary>
    public interface ISalarySys : ISys
    {
        #region Employee Area

        /// <summary> Просмотр зарплаты сотрудника за выбранный период </summary>
        int Get(DateTime startTime, DateTime endTime);

        #endregion

        #region Manager Area

        /// <summary> Просмотр зарплаты выбранного сотрудника (только для менеджеров) </summary>
        int Get(TLEmployee employee, DateTime startTime, DateTime endTime);

        /// <summary> Просмотр зарплат всех сотрудников (только для менеджеров) </summary>
        IDictionary<TLEmployee, int> GetAll(DateTime startTime, DateTime endTime);

        /// <summary> Начисление зарплаты сотруднику (только для менеджеров) </summary>
        bool Pay(TLEmployee user);

        /// <summary> Начисление зарплаты всем сотрдникам (только для менеджеров) </summary>
        bool PayAll();

        /// <summary> Просмотр всех начислений всем сотрудникам (только для менеджеров) </summary>
        IDictionary<TLPayment, TLEmployee> GetAllPayments();

        #endregion
    }

    public interface IUserEmployee
    {
        #region Login System

        bool LogIn();

        bool LogOut();

        #endregion

        #region Personnel System

        TLEmployee GetEmployee();

        bool FinishTask(TLTask task);

        TLPosition GetPosition();

        #endregion

        #region Report System

        TLReport GetReport(DateTime startTime, DateTime endTime);

        #endregion

        #region Salary System

        int GetSalary(DateTime startTime, DateTime endTime);

        #endregion
    }

    public interface IManagerEmployee : IUserEmployee
    {
        #region Login System

        new bool LogIn();

        new bool LogOut();

        #endregion
        
        #region Personnel System

        new TLEmployee GetEmployee();

        new bool FinishTask(TLTask task);

        bool AddEmployee(TLEmployee employee);

        bool EditEmployee(TLEmployee oldEmployee, TLEmployee newEmployee);

        bool DeleteEmployee(TLEmployee employee);

        IEnumerable<TLEmployee> GetAllEmployees();

        bool AddTask(TLTask task);

        bool DeleteTask(TLTask task);

        bool EditTask(TLTask oldTask, TLTask newTask);

        bool CloseTask(TLTask task);

        IEnumerable<TLTask> GetAllTasks();

        IEnumerable<TLPosition> GetAllPositions();

        #endregion

        #region Report System

        new TLReport GetReport(DateTime startTime, DateTime endTime);

        IEnumerable<TLReport> GetAllReports(DateTime startTime, DateTime endTime);

        #endregion

        #region Salary System

        new int GetSalary(DateTime startTime, DateTime endTime);

        int GetEmployeeSalary(TLEmployee employee, DateTime startTime, DateTime endTime);

        IDictionary<TLEmployee, int> GetAllSalaries(DateTime startTime, DateTime endTime);

        bool Pay(TLEmployee user);

        bool PayAll();

        IDictionary<TLPayment, TLEmployee> GetAllPayments();

        #endregion
    }
}
